package com.lhy.wallet.common;

import com.lhy.wallet.exception.ExceptionEnum;
import lombok.Data;

/**
 * @author: 卢辉宇
 * @date: 2023/3/10 16:42
 * @description: 通用返回对象，有返回成功和失败方法，描述了状态码和描述信息
 */
@Data
public class ApiRestResponse<T> {
    private Integer status;
    private String msg;
    private T data;

    //定义两个常量
    private static final int OK_CODE=10000;
    private static final String OK_MSG="SUCCESS";

    //生成构造函数
    public ApiRestResponse(Integer status, String msg, T data) {
        this.status = status;
        this.msg = msg;
        this.data = data;
    }

    public ApiRestResponse(Integer status, String msg) {
        this.status = status;
        this.msg = msg;
    }

    public ApiRestResponse() {
        this(OK_CODE,OK_MSG); //无参的构造函数直接用初始化的常量做参数调用两参的构造函数
    }

    /*
    * 成功返回的静态方法
    * 无参，返回结果中只有状态码和描述信息
    * */
    public static <T> ApiRestResponse<T> seccess(){
        return new ApiRestResponse<>();
    }

    /**
     * 重载成功返回的静态方法，此方法带参，返回有data数据
     * @param result
     * @param <T>
     * @return
     */
    public static <T> ApiRestResponse<T> seccess(T result){
        ApiRestResponse<T> response = new ApiRestResponse<>();
        response.setData(result); //把result放入data中
        return response;
    }

    /**
     * 返回失败的静态方法
     * @param status
     * @param msg
     * @param <T>
     * @return
     */
    public static <T> ApiRestResponse<T> error(Integer status,String msg){
        return new ApiRestResponse<>(status, msg);
    }

    /**
     * 重载返回失败的静态方法，此方法调用的是枚举类的信息，后续更容易编写
     * @param <T>
     * @param ex
     * @return
     */
    public static <T> ApiRestResponse<T> error(ExceptionEnum ex){
        return new ApiRestResponse<>(ex.getStatus(),ex.getMsg());
    }

}
